iT邦幫忙

2022 iThome 鐵人賽

DAY 3
0

前一篇文章提到,因為設定了一個 font-size: 0 屬性會讓下層的文字都無法顯示在網頁上,除非下一層的元素本身有設定文字大小,把這個文字大小為 0px 的值覆蓋掉。今天就來談談關於 CSS 的屬性繼承 (Inheritance)。

現實生活的繼承示意圖
圖 a: 現實生活的繼承示意圖

談到「繼承」兩字,很直覺地會聯想到現實生活中的繼承。

長輩過世後,法律順位上第一的繼承人可以得到長輩的財產,繼承人的順位是被法律限制的,除非前一個順位的繼承人拋棄繼承,下一個順位的繼承人才能繼承財產。

舉個例子:小明的祖父過世了,留下了台北市信義區的豪宅兩棟,依臺灣民法第1139條之規定,小明的父親是第一順位繼承人,除非小明的父親掛了或拋棄繼承,小明才能得到財產。

CSS 屬性繼承

和現實中的繼承有很大的不同,CSS 的屬性繼承,只要是符合繼承資格的,通通見者有份。

CSS 屬性繼承
圖 b: CSS 屬性繼承示意圖

當父輩的元素設定了文字顏色為 red,子輩、孫輩的元素都會繼承這個顏色屬性。除非子輩或孫輩的元素設定了自己的文字顏色。

繼承值的計算


查看範例 3-1

在這個範例中,我們將 <body> 的字體設為 14px,父字輩的 <div> 元素設為 150%,其餘子輩的元素,非別設為 inheritinitial120%12px,來看看實際的結果。

使用 Chrome 開發者工具查看網頁元素
圖 c: 使用 Chrome 開發者工具查看網頁元素

結果如下:

class value font-size 計算值 說明
.parent 150% 21px 14 乘以 1.5
.child-1 inherit 21px 繼承自 .parent
.child-2 initial 16px 瀏覽器預設值 (16px = 12pt)
.child-3 120% 25.2px 繼承自 .parent 再乘以 1.2
.child-4 12px 12px 自身定義

特別注意文字大小為百分比的情況,會從繼承後的值再乘以百分比,如 .child-3 的情況。

W3C 文件

W3C 網站的 CSS 2.1 附錄文件 是一份表格式文件,條列了 CSS 2.1 的所有屬性資料。

azimuth 這個屬性來舉例,文件網頁上標示著「inherited」為「yes」,標示該屬性具備繼承的特性。

CSS 2.1 附錄文件
圖 d: W3C 文件畫面 - CSS 2.1 附錄文件

如果以上文件有找不到的屬性,想查詢該屬性是否有繼承的特性,可在 W3C 網站查詢這一份 CSS 屬性總表

CSS 屬性總表
圖 e: W3C 文件畫面 - CSS 屬性總表

flex 這個屬性來舉例,文件網頁上標示著「inherited」為「no」,標示該屬性不具備繼承的特性。

具備繼承的屬性

屬性名稱 使用頻率 作用
azimuth 聲音來源方向
border-collapse 表格的邊框模式
border-spacing 表格標框之間的距離,只作用於 border-collapseseparate
caption-side 表格標題的位置
color 字體顏色
cursor 滑鼠游標樣式
direction 文字排列方向,預設由左到右,設為 rtl 文字排列呈現由右至左(阿拉伯語系使用)
elevation 聲音來源位於垂直方向的高度
empty-cells 表格中沒有內容的單元格子的呈現樣式,只作用於 border-collapseseparate
font-family 文字字型
font-size 文字大小
font-style 文字樣式
font-variant 文字變體
font-weight 文字粗細
font 字體相關的屬性集合
letter-spacing 文字字母間的間距
line-height 行高
list-style-image 列表的標記符號使用圖片呈現(作用於 <ul><ol>
list-style-position 列表的標記符號在列表區塊的外面或裡面(作用於 <ul><ol>,預設: outside
list-style-type 列表的標記符號樣式(作用於 <ul><ol>
list-style 列表元素的屬性集合(作用於 <ul><ol>
orphans 列印時,在 block 容器下方顯示的最少行數
pitch-range 聲音頻率範圍(作用於 <audio>
pitch 聲音頻率(作用於 <audio>
quotes 為文字加上引號
richness 聲音亮度(作用於 <audio>
speak-header 聲音導讀媒體播放時,遇到 <table> 的標題要念幾次的次數
speak-numeral 聲音導讀媒體播放時,遇到數字時,要念的方式
speak-punctuation 聲音導讀媒體播放時,遇到符號時,要念的方式
speak 聲音導讀屬性的集合
speech-rate 導讀文字的速度
stress 導讀文字時,加上重音的份量
text-align 文字位置
text-indent 文字段落的首行縮排
text-transform 字母的大寫或小寫
visibility 元素區塊的可見度
voice-family 聲音的系列
volume 音量
white-space 處理元素中的空白字元
widows 列印時,顯示於頁面上方最少行數
word-spacing 單詞的間距

以上為筆者整理的表格。除了「文字顯示」、「列表」相關的屬性,其餘的使用頻率非常地低。

關於 CSS 屬性是否具有繼承特性與否,其實不用特別去記它,有一個大原則,只要和文字顯示相關的都具備這個特性,例如:colorfont-sizetext-align... 等等。

總結

由於 CSS 屬性繼承的特性,在設計前端套件時,盡量要避免使用具繼承的特性的 CSS 屬性,例如 font-size 文字尺寸、line-height 行高,等等。

因為我們的 Slider 裡面的項目元素不是只能放圖片而已,它只是一個區塊,期待它可以放進實務上會用到的資料,例如商品購買介紹、廣告的 Banner、等等。

別讓使用者放資料進去發現,文字顏色不對、大小不斷,行高也跑掉之類的問題。

良好的套件設計應該只設計好功能,其它的樣式處理交給使用者(我們的使用者同樣為前端開發工程師),以達成最好修改,最易客製化的目的。


文中範例可在 GitHub Page 閱讀。
原始碼可在 2022 鐵人賽專用 GitHub Repo 下載。


上一篇
Day 2 - Slider 基本佈局 (Layout)
下一篇
Day 4 - CSS 彈性盒子 (Flexible Box) 的優點
系列文
重造會 Slide 的輪子!深入 JavaScript、CSS 模組化設計30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言